<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <p ref="p">{{count}}</p>
        <p>
            <button @click="count++">count++</button>
        </p>
        <hr>
        <p>
            {{zhang.name}}----{{zhang.age}}---{{zhang.info.height}}
        </p>
        <p>
            <button @click="zhang.age++">age++</button>
            <br>
            <button @click="zhang.info.height++">height++</button>
        </p>
    </div>
</body>
<script>
    let {createApp,nextTick} = Vue;
    let {ref,reactive,readonly,computed,watch,watchEffect,watchPostEffect} = Vue;

    // watchEffect()
    // 立即运行一个函数，同时响应式地追踪其依赖，并在依赖更改时重新执行。

    var app = createApp({
        
        setup(props) {

            let count = ref(100);  /// ref对象
            // console.log(count);

            let addCount = ()=>{
                count.value ++;
            }

            // zhang ->代理对象(响应对象)
            let zhang = reactive({// 目标对象
                name:"张三",
                age:18,
                info:{
                    height:173,
                    weight:65
                }
            });  // new Proxy(data,{get,set})
            
            let p = ref();

            // watchEffect()
            // 立即运行一个函数，同时响应式地追踪其依赖，并在依赖更改时重新执行。

            // watchEffect  接收一个函数
            // 1. 此函数在初始化阶段立即执行 (和计算属性类似)
            // 2. 可以有多个数据依赖 (可以依赖于ref对象,响应对象,计算属性)
            // 3. watchEffect 返回值是stop函数,调用该函数可以停止监听

            // 和计算属性对象
            // 共同点
            // 1. 都会在初始化阶段立即执行  2. 可以有多个数据依赖 
            // 区别:
            // 1. 计算属性要求返回一个新值 => 得到一个新属性    watchEffect会监听依赖的数据发生改变=>执行副作用操作(数据改变产生的影响)
            // 2. watchEffect可以接收第二参数 ->  {flush:"pre"/"sync"/"post"} ,计算属性不行(默认就是created阶段执行)


            // 和watch对象
            // 公共点:
            // 都可以监听数据改变,设置{flush:"pre"/"sync"/"post"}

            // 不同
            // 1. watch懒执行副作用 (watch数据改变之后才会触发) , watchEffect()在初始化阶段立即执行
            // 2. watch更加明确是应该由哪个状态触发侦听器重新执行(单个数据监听),  watchEffect()只要依赖的数据改变就触发(默认可以是多个数据监听,单个也可以)
            // 3. watch可以访问所侦听状态的前一个值和当前值。 watchEffect()只有数据变化后的值


            // let stop = watchEffect(()=>{
            //     console.log("依赖的数据发生改变:count",count.value);
            //     console.log("依赖的数据发生改变:zhang.age",zhang.age);
            //     console.log("依赖的数据发生改变:p",p.value?.innerHTML);

            //     // if(p.value){  // 都会在初始化阶段立即执行 -> 此时还未将元素赋值过来 => p.value=>undefined
            //     //     console.log("依赖的数据发生改变",p);
            //     // }
            // })
            // stop()
            // console.log("stop",stop);



            // let stop = watchEffect(()=>{
            //     console.log("依赖的数据发生改变:count",count.value);
            //     console.log("依赖的数据发生改变:zhang.age",zhang.age);
            //     console.log("依赖的数据发生改变:p",p.value?.innerHTML);

            //     // if(p.value){  // 都会在初始化阶段立即执行 -> 此时还未将元素赋值过来 => p.value=>undefined
            //     //     console.log("依赖的数据发生改变",p);
            //     // }
            // },{flush:"post"})

            let stop = watchPostEffect(()=>{
                console.log("依赖的数据发生改变:count",count.value);
                console.log("依赖的数据发生改变:zhang.age",zhang.age);
                console.log("依赖的数据发生改变:p",p.value?.innerHTML);

            })


            


            return {
                // 键名: 传递出去的数据名 方法名  计算属性
                count:count,
                addCount,
                zhang,
                p,
            }
            
        },
        beforeMount() {
            console.log("beforeMount");
        },
        mounted() {
            console.log("mounted");
            // console.log("this",this);
        },
        watch:{
            // "zhang":function(){},
            // "zhang.age":function(){},
        }
        
    })

    app.mount("#app");








</script>
</html>